#pragma once
#include <stdint.h>
#include <libfdt/libfdt.h>

/* 回调类型（遍历节点时） */
typedef void (*fdt_node_callback_t)(const char *path, int offset, int depth);

/* 全局上下文 */
typedef struct {
    const void *fdt;           /* DTB 的虚拟地址（指向 blob） */
    uint32_t totalsize;
    const void *struct_blk;    /* off_dt_struct 的起始地址（虚拟） */
    const char *strings_blk;   /* off_dt_strings 的起始地址（虚拟） */
    const void *reserve_map;   /* mem reserve map（虚拟） */
    int initialized;           /* 0 = 未初始化, 1 = 已初始化 */
} fdt_context_t;

/* 全局实例（实现文件定义） */
extern fdt_context_t g_fdt_ctx;

/* 初始化：传入 DTB 的物理地址（如果是虚拟地址也可），内部负责映射/检查 */
int fdt_context_init_from_phys(uint64_t dtb_phys);

/* 直接从 boot_get_dtb() 初始化（方便） */
int fdt_context_init_from_boot(void);

/* 获取基本指针 */
static inline const void *fdt_ctx_get_fdt(void) { return g_fdt_ctx.fdt; }

/* 常用 wrapper（read helpers） */
int fdt_ctx_find_node(const char *path); /* 返回 node offset */
int fdt_ctx_get_u32(int node, const char *prop, uint32_t *out);
int fdt_ctx_get_u64(int node, const char *prop, uint64_t *out);
const char *fdt_ctx_get_string(int node, const char *prop);
const void *fdt_ctx_get_prop(int node, const char *prop, int *len);

/* 遍历 */
void fdt_ctx_walk_nodes(fdt_node_callback_t cb);
